Pythonã®warningsãã¬ãŒã ã¯ãŒã¯ã®å¯èœæ§ãæå€§éã«åŒãåºããŸããããã«ã¹ã¿ã èŠåã«ããŽãªã®äœææ¹æ³ãšãæŽç·Žããããã£ã«ã¿ãŒã®é©ç𿹿³ãåŠã³ãããã¯ãªãŒã³ã§ä¿å®ããããã³ãŒããå®çŸããŸãã
Pythonã®Warningsãã¬ãŒã ã¯ãŒã¯ãç¿åŸããïŒã«ã¹ã¿ã ã«ããŽãªãšé«åºŠãªãã£ã«ã¿ãªã³ã°
ãœãããŠã§ã¢éçºã®äžçã§ã¯ããã¹ãŠã®åé¡ãåãããã«æ±ãããããã§ã¯ãããŸãããå³åº§ã«å®è¡ã忢ããªããã°ãªããªãèŽåœçãªé害ãããã°ãããããäŸå€ãšåŒã³ãŸããããããã°ã¬ãŒãŸãŒã³ã«ã€ããŠã¯ã©ãã§ããããïŒçŸæç¹ã§ã¯ã¢ããªã±ãŒã·ã§ã³ãç Žå£ããªãããå°æ¥çã«åé¡ãåŒãèµ·ããå¯èœæ§ã®ããæœåšçãªåé¡ãéæšå¥šã®æ©èœããŸãã¯æé©ã§ã¯ãªãã³ãŒããã¿ãŒã³ã«ã€ããŠã¯ã©ãã§ããããïŒãããèŠåã®é åã§ãããPythonã¯ãããã管çããããã®åŒ·åã§ãããªããããã°ãã°ååã«æŽ»çšãããŠããªããã¬ãŒã ã¯ãŒã¯ãæäŸããŠããŸãã
å€ãã®éçºè
ã¯DeprecationWarning
ãç®ã«ããããšã«æ
£ããŠããŸãããã»ãšãã©ã®äººã¯ãããèŠãã ãã§çµãã£ãŠããŸããŸãã圌ãã¯ããããããšã©ãŒã«ãªããŸã§ç¡èŠããããå®å
šã«æå¶ãããã©ã¡ããã§ããããããPythonã®warnings
ã¢ãžã¥ãŒã«ãç¿åŸããããšã§ããããã®éç¥ãããã¯ã°ã©ãŠã³ããã€ãºãããã³ãŒãå質ãåäžãããã©ã€ãã©ãªã®ã¡ã³ããã³ã¹ãæ¹åãããŠãŒã¶ãŒã«ãšã£ãŠããã¹ã ãŒãºãªãšã¯ã¹ããªãšã³ã¹ãçã¿åºã匷åãªã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ãžãšå€ããããšãã§ããŸãããã®ã¬ã€ãã§ã¯ãåºæ¬ãè¶
ããŠãã«ã¹ã¿ã èŠåã«ããŽãªã®äœæãšæŽç·Žããããã£ã«ã¿ãªã³ã°ã®é©çšã«æ·±ãèžã¿èŸŒã¿ãã¢ããªã±ãŒã·ã§ã³ã®éç¥ãå®å
šã«å¶åŸ¡ããæ¹æ³ã解説ããŸãã
çŸä»£ã®ãœãããŠã§ã¢ã«ãããèŠåã®åœ¹å²
æè¡çãªè©³çްã«å ¥ãåã«ãèŠåã®èåŸã«ããå²åŠãçè§£ããããšãéèŠã§ããèŠåãšã¯ãããéçºè ïŒPythonã³ã¢ããŒã ãã©ã€ãã©ãªäœè ããŸãã¯ããªãèªèº«ãªã©ïŒããå¥ã®éçºè ïŒå€ãã®å Žåãæªæ¥ã®ããªãèªèº«ãããªãã®ã³ãŒãã®ãŠãŒã¶ãŒïŒãžã®ã¡ãã»ãŒãžã§ããããã¯ããæ³šæïŒãã®ã³ãŒãã¯åäœããŸãããç¥ã£ãŠããã¹ãããšããããŸããããšäŒãããéªéã«ãªããªãã·ã°ãã«ã§ãã
èŠåã¯ããã€ãã®äž»èŠãªç®çãæãããŸãã
- éæšå¥šã«é¢ããéç¥ïŒæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ãã䜿çšäžã®é¢æ°ãã¯ã©ã¹ããŸãã¯ãã©ã¡ãŒã¿ãå°æ¥ã®ããŒãžã§ã³ã§åé€ãããããšããŠãŒã¶ãŒã«èŠåããã³ãŒããç§»è¡ããæéãäžããŸãã
- æœåšçãªãã°ã®åŒ·èª¿ïŒæè¡çã«ã¯æå¹ã ããéçºè ã®æå³ãšã¯ç°ãªãå¯èœæ§ã®ããææ§ãªæ§æã䜿çšãã¿ãŒã³ã«ã€ããŠéç¥ããŸãã
- ããã©ãŒãã³ã¹åé¡ã®éç¥ïŒãŠãŒã¶ãŒãéå¹ççãŸãã¯ã¹ã±ãŒã©ãã«ã§ãªãæ¹æ³ã§æ©èœã䜿çšããŠããå¯èœæ§ãããããšãèŠåããŸãã
- å°æ¥ã®åäœå€æŽã®åç¥ïŒ
FutureWarning
ã䜿çšããŠã颿°ã®åäœãæ»ãå€ãå°æ¥ã®ãªãªãŒã¹ã§å€æŽãããããšãéç¥ããŸãã
äŸå€ãšã¯ç°ãªããèŠåã¯ããã°ã©ã ãçµäºãããŸãããããã©ã«ãã§ã¯ãèŠåã¯stderr
ã«åºåãããã¢ããªã±ãŒã·ã§ã³ã®å®è¡ãç¶ç¶ãããŸãããã®éãã¯æ¥µããŠéèŠã§ãããæ©èœæ§ãæãªãããšãªããéèŠã§ã¯ãããèŽåœçã§ã¯ãªãæ
å ±ãäŒããããšãã§ããŸãã
Pythonã®çµã¿èŸŒã¿`warnings`ã¢ãžã¥ãŒã«ã®å ¥é
Pythonã®èŠåã·ã¹ãã ã®äžæ žã¯ãçµã¿èŸŒã¿ã®warnings
ã¢ãžã¥ãŒã«ã§ãããã®äž»ãªæ©èœã¯ãèŠåãçºè¡ããå¶åŸ¡ããããã®æšæºåãããæ¹æ³ãæäŸããããšã§ããåºæ¬çãªã³ã³ããŒãã³ããèŠãŠã¿ãŸãããã
ã·ã³ãã«ãªèŠåã®çºè¡
èŠåãçºè¡ããæãã·ã³ãã«ãªæ¹æ³ã¯ãwarnings.warn()
颿°ã䜿çšããããšã§ãã
import warnings
def old_function(x, y):
warnings.warn("old_function() is deprecated; use new_function() instead.", DeprecationWarning, stacklevel=2)
# ... function logic ...
return x + y
# Calling the function will print the warning to stderr
old_function(1, 2)
ãã®äŸã§ã¯ã3ã€ã®äž»èŠãªåŒæ°ããããŸãã
- ã¡ãã»ãŒãžïŒèŠåã説æãããæç¢ºã§èšè¿°çãªæååã
- ã«ããŽãªïŒåºæ¬ãšãªã
Warning
äŸå€ã®ãµãã¯ã©ã¹ãããã¯åŸè¿°ãããã£ã«ã¿ãªã³ã°ã«ãšã£ãŠéåžžã«éèŠã§ããDeprecationWarning
ã¯äžè¬çãªçµã¿èŸŒã¿ã®éžæè¢ã§ãã stacklevel
ïŒãã®éèŠãªãã©ã¡ãŒã¿ã¯ãèŠåãã©ãããçºçããããã«èŠããããå¶åŸ¡ããŸããstacklevel=1
ïŒããã©ã«ãïŒã¯warnings.warn()
ãåŒã³åºãããè¡ãæããŸããstacklevel=2
ã¯ãç§ãã¡ã®é¢æ°ãåŒã³åºããè¡ãæããéæšå¥šã®åŒã³åºãå ãç¹å®ããããšããŠãããšã³ããŠãŒã¶ãŒã«ãšã£ãŠé¥ãã«åœ¹ç«ã¡ãŸãã
çµã¿èŸŒã¿ã®èŠåã«ããŽãª
Pythonã¯ãçµã¿èŸŒã¿ã®èŠåã«ããŽãªã®éå±€ãæäŸããŠããŸããé©åãªã«ããŽãªã䜿çšããããšã§ãèŠåãããæå³ã®ãããã®ã«ãªããŸãã
Warning
: ãã¹ãŠã®èŠåã®åºåºã¯ã©ã¹ãUserWarning
: ãŠãŒã¶ãŒã³ãŒãã«ãã£ãŠçæãããèŠåã®ããã©ã«ãã«ããŽãªãäžè¬çãªç®çã«é©ããŠããŸããDeprecationWarning
: éæšå¥šã§ãããå°æ¥åé€ãããæ©èœåããïŒPython 2.7ããã³3.2以éãããã©ã«ãã§é衚瀺ïŒãSyntaxWarning
: æ§æãšã©ãŒã§ã¯ãªãããçãããæ§æåããRuntimeWarning
: çãããã©ã³ã¿ã€ã åäœåããFutureWarning
: å°æ¥çã«ã»ãã³ãã£ã¯ã¹ã倿Žãããæ©èœåããPendingDeprecationWarning
: 廿¢äºå®ã§ãããå°æ¥çã«éæšå¥šãšãªãããšãäºæ³ããããããŸã éæšå¥šã«ãªã£ãŠããªãæ©èœåããïŒããã©ã«ãã§é衚瀺ïŒãBytesWarning
:bytes
ããã³bytearray
ã«å¯Ÿããæäœãç¹ã«ããããæååãšæ¯èŒããå Žåã«é¢é£ããŸãã
äžè¬çãªèŠåã®éç
UserWarning
ãDeprecationWarning
ã®ãããªçµã¿èŸŒã¿ã«ããŽãªã䜿çšããããšã¯è¯ãåºçºç¹ã§ãããå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ãè€éãªã©ã€ãã©ãªã§ã¯ãããã«äžååã«ãªããŸãã人æ°ã®ããããŒã¿ãµã€ãšã³ã¹ã©ã€ãã©ãª`DataWrangler`ã®äœè
ã§ãããšæ³åããŠãã ããã
ããªãã®ã©ã€ãã©ãªã¯ãããã€ãã®ç°ãªãçç±ã§èŠåãçºè¡ããå¿ èŠããããããããŸããã
- ããŒã¿åŠç颿°`process_data_v1`ã`process_data_v2`ã«çœ®ãæããããéæšå¥šã«ãªã£ãŠããã
- ãŠãŒã¶ãŒãå€§èŠæš¡ãªããŒã¿ã»ããã«å¯ŸããŠæé©åãããŠããªãã¡ãœããã䜿çšããŠããããããããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãå¯èœæ§ãããã
- èšå®ãã¡ã€ã«ãå°æ¥ã®ãªãªãŒã¹ã§ç¡å¹ã«ãªãæ§æã䜿çšããŠããã
æåã®ã±ãŒã¹ã§DeprecationWarning
ããæ®ãã®2ã€ã®ã±ãŒã¹ã§UserWarning
ã䜿çšãããšããŠãŒã¶ãŒãæã€å¶åŸ¡ã¯éåžžã«éãããŸãããŠãŒã¶ãŒãããªãã®ã©ã€ãã©ãªå
ã®ãã¹ãŠã®éæšå¥šããšã©ãŒãšããŠæ±ããç§»è¡ã匷å¶ãããããããã©ãŒãã³ã¹èŠåã¯ã»ãã·ã§ã³ããšã«äžåºŠã ã衚瀺ãããå Žåã¯ã©ãã§ããããïŒæ±çšçãªã«ããŽãªã ãã§ã¯ãããã¯äžå¯èœã§ãã圌ãã¯ãã¹ãŠã®UserWarning
ãé»ããããïŒéèŠãªããã©ãŒãã³ã¹ã®ãã³ããèŠéãïŒããããã«æº¢ããŠããŸããã®ã©ã¡ããã«ãªãã§ãããã
ããã«ãèŠåç²åŽããçºçããŸããéçºè ãå€ãã®ç¡é¢ä¿ãªèŠåãç®ã«ãããšãéèŠãªèŠåãå«ãããã¹ãŠãç¡èŠãå§ããŸãã解決çã¯ãç¬èªã®ãã¡ã€ã³åºæã®èŠåã«ããŽãªãäœæããããšã§ãã
ã«ã¹ã¿ã èŠåã«ããŽãªã®äœæïŒãã现ããªå¶åŸ¡ã®éµ
ã«ã¹ã¿ã èŠåã«ããŽãªã®äœæã¯é©ãã»ã©ç°¡åã§ããçµã¿èŸŒã¿ã®èŠåã¯ã©ã¹ãéåžžã¯UserWarning
ãŸãã¯åºåºã®Warning
ããç¶æ¿ããã¯ã©ã¹ãäœæããã ãã§ãã
ã«ã¹ã¿ã èŠåã®äœææ¹æ³
`DataWrangler`ã©ã€ãã©ãªçšã®ç¹å®ã®èŠåãäœæããŠã¿ãŸãããã
# In datawrangler/warnings.py
class DataWranglerWarning(UserWarning):
"""Base warning for the DataWrangler library."""
pass
class PerformanceWarning(DataWranglerWarning):
"""Warning for potential performance issues."""
pass
class APIDeprecationWarning(DeprecationWarning):
"""Warning for deprecated features in the DataWrangler API."""
# Inherit from DeprecationWarning to be consistent with Python's ecosystem
pass
class ConfigSyntaxWarning(DataWranglerWarning):
"""Warning for outdated configuration file syntax."""
pass
ãã®ã·ã³ãã«ãªã³ãŒãã¯éåžžã«åŒ·åã§ããæç¢ºã§éå±€çããã€èšè¿°çãªèŠåã»ãããäœæããŸãããããã§ãã©ã€ãã©ãªã§èŠåãçºè¡ããéã«ããããã®ã«ã¹ã¿ã ã¯ã©ã¹ã䜿çšããŸãã
# In datawrangler/processing.py
import warnings
from .warnings import PerformanceWarning, APIDeprecationWarning
def process_data_v1(data):
warnings.warn(
"`process_data_v1` is deprecated and will be removed in DataWrangler 2.0. Use `process_data_v2` instead.",
APIDeprecationWarning,
stacklevel=2
)
# ... logic ...
def analyze_data(df):
if len(df) > 1_000_000 and df.index.name is None:
warnings.warn(
"DataFrame has over 1M rows and no named index. This may lead to slow joins. Consider setting an index.",
PerformanceWarning,
stacklevel=2
)
# ... logic ...
APIDeprecationWarning
ãšPerformanceWarning
ã䜿çšããããšã§ãç¹å®ã®ãã£ã«ã¿ãªã³ã°å¯èœãªã¡ã¿ããŒã¿ãèŠåã«åã蟌ãããšãã§ããŸããããã«ããããŠãŒã¶ãŒïŒããã³ãã¹ãäžã®ç§ãã¡èªèº«ïŒã¯ãèŠåãã©ã®ããã«åŠçããããã«ã€ããŠãã现ããªå¶åŸ¡ãå¯èœã«ãªããŸãã
ãã£ã«ã¿ãªã³ã°ã®åïŒèŠååºåã®å¶åŸ¡
ç¹å®ã®èŠåãçºè¡ããããšã¯è©±ã®ååã«éããŸãããæ¬åœã®åã¯ãããããã£ã«ã¿ãªã³ã°ããããšã«ãããŸããwarnings
ã¢ãžã¥ãŒã«ã¯ããããè¡ãããã®äž»ã«2ã€ã®æ¹æ³ãæäŸããŸããwarnings.simplefilter()
ãšããã匷åãªwarnings.filterwarnings()
ã§ãã
ãã£ã«ã¿ãŒã¯ã(ã¢ã¯ã·ã§ã³ãã¡ãã»ãŒãžãã«ããŽãªãã¢ãžã¥ãŒã«ãè¡çªå·) ã®ã¿ãã«ã§å®çŸ©ãããŸããèŠåã¯ããã®ãã¹ãŠã®å±æ§ããã£ã«ã¿ãŒå ã®å¯Ÿå¿ããå€ãšäžèŽããå Žåã«ãããããŸãããã£ã«ã¿ãŒå ã®ãã£ãŒã«ãã®ããããã`0`ãŸãã¯`None`ã®å Žåãããã¯ã¯ã€ã«ãã«ãŒããšããŠæ±ããããã¹ãŠã«ãããããŸãã
ãã£ã«ã¿ãªã³ã°ã¢ã¯ã·ã§ã³
`action`æååã¯ãèŠåããã£ã«ã¿ãŒã«ããããããšãã«äœãèµ·ããããæ±ºå®ããŸãã
"default"
: äžèŽããèŠåãçºè¡ãããåå Žæã§ãæåã«åºçŸãããã®ãåºåããŸãã"error"
: äžèŽããèŠåãäŸå€ã«å€ããŸããããã¯ãã¹ãã§éåžžã«åœ¹ç«ã¡ãŸãïŒ"ignore"
: äžèŽããèŠåã絶察ã«åºåããŸããã"always"
: 以åã«è¡šç€ºãããããšãããå Žåã§ããäžèŽããèŠåãåžžã«åºåããŸãã"module"
: äžèŽããèŠåãçºè¡ãããã¢ãžã¥ãŒã«ããšã«ãæåã«åºçŸãããã®ãåºåããŸãã"once"
: å Žæã«é¢ä¿ãªããäžèŽããèŠåã®æåã«åºçŸããäžåºŠã ããåºåããŸãã
ã³ãŒãã§ã®ãã£ã«ã¿ãŒã®é©çš
ããã§ã¯ã`DataWrangler`ã©ã€ãã©ãªã®ãŠãŒã¶ãŒãã«ã¹ã¿ã ã«ããŽãªãã©ã®ããã«æŽ»çšã§ããããèŠãŠã¿ãŸãããã
ã·ããªãª1ïŒãã¹ãäžã«éæšå¥šã®ä¿®æ£ã匷å¶ãã
CI/CDãã€ãã©ã€ã³äžã«ãæ°ããã³ãŒããéæšå¥šã®é¢æ°ã䜿çšããªãããã«ããããšããŸããç¹å®ã®éæšå¥šèŠåããšã©ãŒã«å€ããããšãã§ããŸãã
import warnings
from datawrangler.warnings import APIDeprecationWarning
# Treat only our library's deprecation warnings as errors
warnings.filterwarnings("error", category=APIDeprecationWarning)
# This will now raise an APIDeprecationWarning exception instead of just printing a message.
try:
from datawrangler.processing import process_data_v1
process_data_v1()
except APIDeprecationWarning:
print("Caught the expected deprecation error!")
ãã®ãã£ã«ã¿ãŒã¯ãNumPyãPandasã®ãããªä»ã®ã©ã€ãã©ãªããã®`DeprecationWarning`ã«ã¯åœ±é¿ããªãããšã«æ³šæããŠãã ããããããç§ãã¡ãæ±ããŠãã粟床ã§ãã
ã·ããªãª2ïŒæ¬çªç°å¢ã§ã®ããã©ãŒãã³ã¹èŠåã®æå¶
æ¬çªç°å¢ã§ã¯ãããã©ãŒãã³ã¹èŠåããã°ãã€ãºãéå°ã«çºçãããå¯èœæ§ããããŸãããŠãŒã¶ãŒã¯ããããç¹å®ããŠæå¶ããããšãéžæã§ããŸãã
import warnings
from datawrangler.warnings import PerformanceWarning
# We've identified the performance issues and accept them for now
warnings.filterwarnings("ignore", category=PerformanceWarning)
# This call will now run silently with no output
from datawrangler.processing import analyze_data
analyze_data(large_dataframe)
æ£èŠè¡šçŸã«ããé«åºŠãªãã£ã«ã¿ãªã³ã°
`filterwarnings()`ã®`message`ãš`module`åŒæ°ã¯æ£èŠè¡šçŸã«ããããšãã§ããŸããããã«ãããããã«åŒ·åã§ç²Ÿå¯ãªãã£ã«ã¿ãªã³ã°ãå¯èœã«ãªããŸãã
äŸãã°ãã³ãŒãããŒã¹å šäœã§ãç¹å®ã®ãã©ã¡ãŒã¿ãäŸãã°`old_param`ã«é¢é£ãããã¹ãŠã®éæšå¥šèŠåãç¡èŠããããšããŸãã
import warnings
# Ignore any warning containing the phrase "old_param is deprecated"
warnings.filterwarnings("ignore", message=".*old_param is deprecated.*")
ã³ã³ããã¹ããããŒãžã£ãŒïŒ`warnings.catch_warnings()`
æã«ã¯ãã³ãŒãã®å°ããªã»ã¯ã·ã§ã³ãäŸãã°åäžã®ãã¹ãã±ãŒã¹å ã§ã®ã¿ãã£ã«ã¿ãŒèŠåã倿Žããå¿ èŠãããå ŽåããããŸããã°ããŒãã«ãã£ã«ã¿ãŒã倿Žããããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«åœ±é¿ãäžããå¯èœæ§ãããããå±éºã§ãã`warnings.catch_warnings()`ã³ã³ããã¹ããããŒãžã£ãŒã¯å®ç§ãªè§£æ±ºçã§ããããã¯ãšã³ããªæã«çŸåšã®ãã£ã«ã¿ãŒç¶æ ãèšé²ããçµäºæã«ããã埩å ããŸãã
import warnings
from datawrangler.processing import process_data_v1
from datawrangler.warnings import APIDeprecationWarning
print("--- Entering context manager ---")
with warnings.catch_warnings(record=True) as w:
# Cause all warnings to be triggered
warnings.simplefilter("always")
# Call our deprecated function
process_data_v1()
# Verify that the correct warning was caught
assert len(w) == 1
assert issubclass(w[-1].category, APIDeprecationWarning)
assert "process_data_v1" in str(w[-1].message)
print("--- Exited context manager ---")
# Outside the context manager, the filters are back to their original state.
# This call will behave as it did before the 'with' block.
process_data_v1()
ãã®ãã¿ãŒã³ã¯ãã°ããŒãã«ãªèŠåèšå®ã劚ããããšãªããç¹å®ã®èŠåãçºè¡ãããŠããããšãã¢ãµãŒãããå ç¢ãªãã¹ããäœæããäžã§éåžžã«è²Žéã§ãã
å®çšçãªãŠãŒã¹ã±ãŒã¹ãšãã¹ããã©ã¯ãã£ã¹
ããŸããŸãªã·ããªãªã«å¯Ÿå¿ãããå®çšçãªãã¹ããã©ã¯ãã£ã¹ãšããŠç¥èããŸãšããŸãããã
ã©ã€ãã©ãªããã³ãã¬ãŒã ã¯ãŒã¯éçºè åã
- åºåºèŠåã®å®çŸ©ïŒããªãã®ã©ã€ãã©ãªã®åºåºèŠåïŒäŸïŒ`MyLibraryWarning(Warning)`)ãäœæããä»ã®ãã¹ãŠã®ã©ã€ãã©ãªåºæã®èŠåããããç¶æ¿ããããã«ããŸããããã«ããããŠãŒã¶ãŒã¯1ã€ã®ã«ãŒã«ã§ã©ã€ãã©ãªããã®ãã¹ãŠã®èŠåãå¶åŸ¡ã§ããŸãã
- å ·äœçã«ïŒåäžã®ã«ã¹ã¿ã èŠåãäœæããã ãã§ãªãã`PerformanceWarning`ã`APIDeprecationWarning`ã`ConfigWarning`ã®ãããªãè€æ°ã®èšè¿°çãªã«ããŽãªãäœæããŸãã
- èŠåã®ããã¥ã¡ã³ãåïŒãŠãŒã¶ãŒã¯ãèŠåãååšããããšãç¥ã£ãŠããå Žåã«ã®ã¿ãã£ã«ã¿ãŒã§ããŸããå ¬éAPIã®äžéšãšããŠã«ã¹ã¿ã èŠåã«ããŽãªãããã¥ã¡ã³ãåããŸãã
- `stacklevel=2`ïŒãŸãã¯ãã以äžïŒã®äœ¿çšïŒèŠåãã©ã€ãã©ãªã®å éšã§ã¯ãªãããŠãŒã¶ãŒã®ã³ãŒããæãããã«ããŸããå éšã®åŒã³åºãã¹ã¿ãã¯ãæ·±ãå Žåã¯ãããã調æŽããå¿ èŠããããããããŸããã
- æç¢ºã§å®è¡å¯èœãªã¡ãã»ãŒãžã®æäŸïŒè¯ãèŠåã¡ãã»ãŒãžã¯ãäœãåé¡ã§ããªãåé¡ãªã®ãããããŠã©ãããã°è§£æ±ºã§ãããã説æããŸããã颿°Xã¯éæšå¥šã§ããã§ã¯ãªããã颿°Xã¯éæšå¥šã§ãããv3.0ã§åé€ãããŸãã代ããã«Function Yã䜿çšããŠãã ããããã®ããã«èšè¿°ããŸãã
ã¢ããªã±ãŒã·ã§ã³éçºè åã
- ç°å¢ããšã«ãã£ã«ã¿ãŒãèšå®ïŒ
- éçºïŒåé¡ãæ©æã«çºèŠããããã«ãã»ãšãã©ã®èŠåã衚瀺ããŸãã`warnings.simplefilter('default')`ãè¯ãåºçºç¹ã§ãã
- ãã¹ãïŒå³æ Œã«ãã¢ããªã±ãŒã·ã§ã³ã®èŠåãéèŠãªã©ã€ãã©ãªã®éæšå¥šããšã©ãŒã«å€æããŸãïŒ`warnings.filterwarnings('error', category=...)`)ãããã«ããããªã°ã¬ãã·ã§ã³ãæè¡çè² åµãé²ããŸãã
- æ¬çªïŒéžæçã«ããã°ãã¯ãªãŒã³ã«ä¿ã€ããã«åªå 床ã®äœãèŠåãç¡èŠããããããããŸããããåŸã§ã¬ãã¥ãŒããããã«ãã®ã³ã°ãã³ãã©ãŒãèšå®ããŠãããããã£ããã£ããŸãã
- ãã¹ãã§ã³ã³ããã¹ããããŒãžã£ãŒã䜿çšïŒå¯äœçšãªãã«èŠåã®åäœããã¹ãããããã«ãåžžã«`with warnings.catch_warnings():`ã䜿çšããŠãã ããã
- ãã¹ãŠã®èŠåãã°ããŒãã«ã«ç¡èŠããªãïŒãã€ãºãé»ãããããã«ã¹ã¯ãªããã®å é ã«`warnings.filterwarnings('ignore')`ã远å ããããªããããããŸããããããã¯å±éºã§ããã»ãã¥ãªãã£ã®è匱æ§ãäŸåé¢ä¿ã®ä»åŸã®ç Žå£ç倿Žã«é¢ããéèŠãªæ å ±ãèŠéããŠããŸããŸããæ£ç¢ºã«ãã£ã«ã¿ãŒããŠãã ããã
ã³ãŒãå€ããã®èŠåã®å¶åŸ¡
çŸããèšèšãããèŠåã·ã¹ãã ã¯ãã³ãŒãã®è¡ãäžå倿Žããããšãªãèšå®ãå¯èœã«ããŸããããã¯éçšããŒã ããšã³ããŠãŒã¶ãŒã«ãšã£ãŠäžå¯æ¬ ã§ãã
ã³ãã³ãã©ã€ã³ãã©ã°ïŒ`-W`
èŠåã¯ã`-W`åŒæ°ã䜿çšããŠã³ãã³ãã©ã€ã³ããçŽæ¥å¶åŸ¡ã§ããŸããæ§æã¯`-W action:message:category:module:lineno`ã§ãã
äŸãã°ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã¹ãŠã®`APIDeprecationWarning`ããšã©ãŒãšããŠæ±ãã«ã¯ïŒ
python -W error::datawrangler.warnings.APIDeprecationWarning my_app.py
ç¹å®ã®ã¢ãžã¥ãŒã«ããã®ãã¹ãŠã®èŠåãç¡èŠããã«ã¯ïŒ
python -W ignore:::annoying_module my_app.py
ç°å¢å€æ°ïŒ`PYTHONWARNINGS`
åã广ã¯ã`PYTHONWARNINGS`ç°å¢å€æ°ãèšå®ããããšã§ãå®çŸã§ããŸããããã¯Dockerã®ãããªã³ã³ããåãããç°å¢ãCI/CDèšå®ãã¡ã€ã«ã§ç¹ã«åœ¹ç«ã¡ãŸãã
# This is equivalent to the first -W example above
export PYTHONWARNINGS="error::datawrangler.warnings.APIDeprecationWarning"
python my_app.py
è€æ°ã®ãã£ã«ã¿ãŒã¯ã³ã³ãã§åºåãããšãã§ããŸãã
çµè«ïŒãã€ãºããã·ã°ãã«ãž
Pythonã®èŠåãã¬ãŒã ã¯ãŒã¯ã¯ãã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžãåºåããåçŽãªã¡ã«ããºã ãã¯ããã«è¶ ããŠããŸããããã¯ãã³ãŒãã®äœæè ãšã³ãŒãã®äœ¿çšè ãšã®éã®æŽç·Žãããã³ãã¥ãã±ãŒã·ã§ã³ã·ã¹ãã ã§ããæ±çšçãªçµã¿èŸŒã¿ã«ããŽãªãè¶ ããŠãã«ã¹ã¿ã ã®èšè¿°çãªèŠåã¯ã©ã¹ãæ¡çšããããšã§ããã现ããªå¶åŸ¡ã«å¿ èŠãªããã¯ãæäŸããŸãã
ã€ã³ããªãžã§ã³ããªãã£ã«ã¿ãªã³ã°ãšçµã¿åãããããšã§ããã®ã·ã¹ãã ã¯éçºè ããã¹ã¿ãŒãããã³éçšãšã³ãžãã¢ãç¹å®ã®ã³ã³ããã¹ãã«åãããŠS/Næ¯ã調æŽããããšãå¯èœã«ããŸããéçºæ®µéã§ã¯ãèŠåã¯ããè¯ããã©ã¯ãã£ã¹ã®æéãšãªããŸãããã¹ã段éã§ã¯ããªã°ã¬ãã·ã§ã³ãæè¡çè² åµã«å¯Ÿããã»ãŒããã£ããããšãªããŸããæ¬çªç°å¢ã§ã¯ãç¡é¢ä¿ãªãã€ãºã®æŽªæ°Žã§ã¯ãªãã管çãããå®è¡å¯èœãªæ å ±ã®æµããšãªããŸãã
次åã©ã€ãã©ãªãè€éãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«ã¯ãåã«æ±çšçãª`UserWarning`ãçºè¡ããã ãã§ãªããã«ã¹ã¿ã èŠåã«ããŽãªãå®çŸ©ããããã«æéãå²ããŠã¿ãŠãã ãããæªæ¥ã®ããªãèªèº«ãååããããŠãŠãŒã¶ãŒã¯ãæœåšçãªãã€ãºãæç¢ºã§äŸ¡å€ã®ããã·ã°ãã«ã«å€ããŠãããããšã«æè¬ããã§ãããã